package cn.outsourcing.supermarket.common.utils;

import cn.outsourcing.supermarket.common.PageResult;
import cn.outsourcing.supermarket.common.Result;
import cn.outsourcing.supermarket.common.exception.SupermarketException;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;

import java.util.List;
import java.util.Map;

/**
 * 结果处理工具类
 *
 * @author gzkemays
 * @since 2021/10/15 21:05
 */
public class ResultUtils {

  /**
   * 异常 Result
   *
   * @param exception 超市异常代码
   * @return {@link Result} 异常信息
   */
  public static Result exception(SupermarketException exception) {
    return Result.builder().errno(exception.getErrno()).errmsg(exception.getErrmsg()).build();
  }

  /**
   * 通过封装的 Page 返回分页数据结果
   *
   * @param pageResult {@link PageResult} 经过封装的分页实体
   * @param <T> 泛型指定实体类
   * @return 返回分页结果 --> { {@link Result#getData()} = {@link PageResult}}
   */
  public static <T> Result pageResult(PageResult<T> pageResult) {
    return Result.builder().data(pageResult).build();
  }

  /**
   * 返回分页数据结果
   *
   * @param page {@link Page} 的分页对象
   * @param <T> 泛型指定实体类
   * @return 返回分页结果 --> { {@link Result#getData()} = {@link PageResult}}
   */
  public static <T> Result pageResult(Page<T> page) {
    List<T> records = page.getRecords();
    return Result.builder()
        .data(
            PageResult.<T>builder()
                .pageSize(page.getSize())
                .currentPage(page.getCurrent())
                .totalPages(page.getTotal())
                .count(records.size())
                .data(records)
                .build())
        .build();
  }

  /**
   * 构建 Map 返回结果数据
   *
   * @param map Map 对象
   * @return 返回嵌入结果
   */
  public static Result mapResult(Map<?, ?> map) {
    return Result.builder().data(map).build();
  }

  /**
   * 简单构建 data
   *
   * @param data 入参 data
   * @return 返回入参后的结果
   */
  public static Result simpleResult(Object data) {
    return Result.builder().data(data).build().defaultError();
  }
}
